/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.edu.pucp.Seguridad.Controlador;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
import org.joda.time.DateTime;
import org.joda.time.Interval;
import org.joda.time.Months;
import pe.edu.pucp.Modelo.EstadoUsuario;
import pe.edu.pucp.Modelo.Password;
import pe.edu.pucp.Modelo.Usuario;
import pe.edu.pucp.Seguridad.DAO.ConfiguracionDAO;
import pe.edu.pucp.Seguridad.DAO.UsuarioDAO;
import pe.edu.pucp.Seguridad.Vista.LoginGUI;
import pe.edu.pucp.Seguridad.Vista.RecuperarPassGUI;
import pe.edu.pucp.Util.Constante;
import pe.edu.pucp.Util.EmailHelper;
import pe.edu.pucp.Util.Encriptador;
import pe.edu.pucp.Util.ValHelper;
import sigepa.MainController;
import sigepa.MainMenuGUI;

/**
 *
 * @author jorge
 */
public class LoginControlador {
    private UsuarioDAO m;
    private LoginGUI view;
    private Usuario usr;
    
    public LoginControlador(UsuarioDAO dao, LoginGUI lview){
        m = dao;
        view = lview;
        view.addEntrarListener(new entrarListener());        
        view.addRecPassListener(new recuperarPassListener()); 
    }
    
    public Password nuevoPass(String pass, Usuario usr){
        Password p = new Password();
        p.setPass(pass);              
        p.setEstadoPassword(m.buscarEstadoPass(Constante.ESTADO_PASSWORD_ACTIVO));
        p.setFechareg(new Date());
        p.setUsuario(usr);
        return p;
    }
    
    class entrarListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
            usr = m.buscarUsuario(view.getUsuario());
            Encriptador cripto = new Encriptador();
            if (usr!=null){
                if (usr.getPerfil().getEstadoPerfil().getIdestado()==Constante.ESTADO_PERFIL_INACTIVO){
                    ValHelper.mostrarAviso("Perfil de usuario "+usr.getNombusr()+" inactivo");
                    return;
                }                   
                if (usr.getEstadoUsuario().getIdestado()==Constante.ESTADO_USUARIO_INACTIVO){
                    ValHelper.mostrarAviso("Usuario "+usr.getNombusr()+" inactivo");
                    return;
                }                
                if (usr.getEstadoUsuario().getIdestado()==Constante.ESTADO_USUARIO_INHABILITADO){
                    ValHelper.mostrarAviso("Usuario "+usr.getNombusr()+" bloqueado");
                    return;
                }
                if (usr.getNumfallo() > usr.getMaxfallo()){
                    EstadoUsuario est = m.buscarEstado(Constante.ESTADO_USUARIO_INHABILITADO); 
                    usr.setEstadoUsuario(est);
                    usr.setNumfallo(0);
                    m.modificarUsuario(usr);
                    ValHelper.mostrarAviso("Usuario "+usr.getNombusr()+" bloqueado");
                    return;
                }    

                String passcryp = cripto.encriptar(view.getPass());
                if (m.buscarPassActual(usr.getIdusuario()).getPass().equals(passcryp)){
                    if (usr.getConexion().getIdconexion()==Constante.ESTADO_SESION_CONECTADO){
                        ValHelper.mostrarAviso("Usuario "+usr.getNombusr()+" en sesión");
                        return;
                    }
                    Date ahora = new Date();
                    Date fechareg = m.buscarPassActual(usr.getIdusuario()).getFechareg();
                    Interval interval = new Interval(new DateTime(fechareg),new DateTime(ahora));
                    int meses = Months.monthsIn(interval).getMonths();                                    
                    if  (meses>usr.getPerfil().getDurpass()){
                        String npass = ValHelper.generarPass((new ConfiguracionDAO()).buscarConfiguracion());
                        Password p = nuevoPass(cripto.encriptar(npass),usr);
                        m.guardarPassword(p);
                        EmailHelper.enviarCorreo(usr.getCorreo()+usr.getTipoCorreo().getExtension(), usr.getNombre(), usr.getNombusr(), npass);
                        ValHelper.mostrarAviso("Su contraseña ha expirado "+ usr.getNombusr() +". Se le ha enviado una nueva a su correo");
                        return;
                    }
                    usr.setConexion(m.buscarEstadoConexion(Constante.ESTADO_SESION_CONECTADO));
                    
                    
                    usr.setNumfallo(0);
                    m.modificarUsuario(usr);
                    MainMenuGUI sigepaMain = new MainMenuGUI();
                    MainController c = new MainController(sigepaMain,usr);
                    sigepaMain.setVisible(true);
                    view.dispose();

                }
                else {
                    ValHelper.mostrarAviso("Contraseña incorrecta");     
                    view.LimpiarPass();
                    usr.setNumfallo(usr.getNumfallo()+1);
                    m.modificarUsuario(usr);
                }
            }
            else {
                ValHelper.mostrarAviso("Usuario no existe");
                view.LimpiarDatos();
            }                 
        }        
    }    
    
    class recuperarPassListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
            RecuperarPassGUI recpass = new RecuperarPassGUI();
            RecuperarPassControlador c = new RecuperarPassControlador(m,recpass);
            recpass.setVisible(true);            
        }        
    }    
        
}
